package xyz.eden.cloud.common.core.json;//package com.welink.paas.pms.common.json;
//
//
//import com.alibaba.fastjson2.*;
//import com.alibaba.fastjson2.reader.ObjectReaderProvider;
//import com.alibaba.fastjson2.util.ParameterizedTypeImpl;
//import com.alibaba.fastjson2.util.TypeUtils;
//
//import java.lang.reflect.ParameterizedType;
//import java.lang.reflect.Type;
//import java.text.SimpleDateFormat;
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.time.LocalTime;
//import java.time.format.DateTimeFormatter;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//import java.util.Objects;
//import java.util.function.Function;
//
///**
// * Json 工具
// *
// * @author gavin
// * @version 1.0
// * @descriptor
// * @date 2022/12/4 21:03
// */
//public class JsonToolByFastJson {
//
//    private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
//    private static final String DATE_FORMAT = "yyyy-MM-dd";
//    private static final String TIME_FORMAT = "HH:mm:ss";
//    private static final DateTimeFormatter LOCAL_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(DATE_TIME_FORMAT);
//    private static final DateTimeFormatter LOCAL_DATE_FORMATTER = DateTimeFormatter.ofPattern(DATE_FORMAT);
//    private static final DateTimeFormatter LOCAL_TIME_FORMATTER = DateTimeFormatter.ofPattern(TIME_FORMAT);
//
//    private static final ThreadLocal<SimpleDateFormat> DATE_FORMATTER = ThreadLocal.withInitial(() -> {
//        return new SimpleDateFormat(DATE_TIME_FORMAT);
//    });
//
//    /**
//     * 序列化
//     */
//    private static final Function<LocalDateTime, String> LOCAL_DATE_TIME_SERIALIZER = LOCAL_DATE_TIME_FORMATTER::format;
//    private static final Function<LocalDate, String> LOCAL_DATE_SERIALIZER = LOCAL_DATE_FORMATTER::format;
//    private static final Function<LocalTime, String> LOCAL_TIME_SERIALIZER = LOCAL_TIME_FORMATTER::format;
//    private static final Function<Date, String> DATE_SERIALIZER = json -> DATE_FORMATTER.get().format(json);
//
//    /**
//     * 反序列化
//     */
//    private static final Function<String, LocalDateTime> LOCAL_DATE_TIME_DESERIALIZER = json -> LocalDateTime.parse(json, LOCAL_DATE_TIME_FORMATTER);
//    private static final Function<String, LocalDate> LOCAL_DATE_DESERIALIZER = json -> LocalDate.parse(json, LOCAL_DATE_FORMATTER);
//    private static final Function<String, LocalTime> LOCAL_TIME_DESERIALIZER = json -> LocalTime.parse(json, LOCAL_TIME_FORMATTER);
//    private static final Function<Date, String> DATE_DESERIALIZER = json -> DATE_FORMATTER.get().format(json);
//    private static final ObjectReaderProvider PROVIDER;
//
//    static {
//        PROVIDER = JSONFactory.getDefaultObjectReaderProvider();
//
//        /**
//         * 序列化
//         */
//        PROVIDER.registerTypeConvert(LocalDateTime.class, String.class, LOCAL_DATE_TIME_SERIALIZER);
//        PROVIDER.registerTypeConvert(LocalDate.class, String.class, LOCAL_DATE_SERIALIZER);
//        PROVIDER.registerTypeConvert(LocalTime.class, String.class, LOCAL_TIME_SERIALIZER);
//        PROVIDER.registerTypeConvert(Date.class, String.class, DATE_SERIALIZER);
//
//        /**
//         * 反序列化
//         */
//        PROVIDER.registerTypeConvert(String.class, LocalDateTime.class, LOCAL_DATE_TIME_DESERIALIZER);
//        PROVIDER.registerTypeConvert(String.class, LocalDate.class, LOCAL_DATE_DESERIALIZER);
//        PROVIDER.registerTypeConvert(String.class, LocalTime.class, LOCAL_TIME_DESERIALIZER);
//        PROVIDER.registerTypeConvert(String.class, Date.class, DATE_DESERIALIZER);
//
//    }
//
//    public static Map<String, Object> toJavaMap(String jsonStr) {
//        return JSON.parseObject(jsonStr, new TypeReference<Map<String, Object>>() {
//        });
//    }
//
//    public static <T> Map<String, T> toJavaMap(String jsonStr, Class<T> clazz) {
//        return JSON.parseObject(jsonStr, mackJavaType(Map.class, String.class, clazz));
//    }
//
//    public static <T> List<T> toJavaList(String jsonStr) {
////        return JSON.parseObject(jsonStr, new TypeReference<List<Object>>() {
////        });
//        return null;
//    }
//
//    public static <T> List<T> toJavaList(String jsonStr, Class<T> clazz) {
//        return JSON.parseObject(jsonStr, mackJavaType(List.class, clazz));
//    }
//
//    public static <T> T toJsonObj(String jsonStr, TypeReference<T> typeReference) {
//        return JSON.parseObject(jsonStr, typeReference);
//    }
//
//    public static <T> T toJavaObj(String jsonStr, Type type) {
//        return JSON.parseObject(jsonStr, type);
//    }
//
//    public static <T> T toJavaObj(String jsonStr, Class<T> clazz) {
//        return JSON.parseObject(jsonStr, clazz);
//    }
//
//    public static Map<String, Object> toJavaMap(Object node) {
//        return toJavaObj(node, new TypeReference<Map<String, Object>>() {
//        });
//    }
//
//    public static <T> Map<String, T> toJavaMap(Object node, Class<T> clazz) {
//        return toJavaObj(node, mackJavaType(Map.class, String.class, clazz));
//    }
//
//    public static List<Object> toJavaList(Object node) {
//        return toJavaObj(node, new TypeReference<List<Object>>() {
//        });
//    }
//
//    public static <T> List<T> toJavaList(Object node, Class<T> clazz) {
//        return toJavaObj(node, mackJavaType(List.class, clazz));
//    }
//
//    public static <T> T toJavaObj(Object node, TypeReference<T> typeReference) {
//        if (node instanceof JSONObject jsonObject) {
//            return typeReference.to(jsonObject);
//        }
//
//        if (node instanceof JSONArray jsonArray) {
//            return typeReference.to(jsonArray);
//        }
//
//        if (node instanceof String str) {
//            return JSON.parseObject(str, typeReference);
//        }
//
//        return (T) TypeUtils.cast(node, typeReference.getRawType());
//    }
//
//    public static <T> T toJavaObj(Object node, Type type) {
//        if (node instanceof JSONObject jsonObject) {
//            return jsonObject.to(type);
//        }
//        if (node instanceof JSONArray jsonArray) {
//            return jsonArray.to(type);
//        }
//
//        if (node instanceof String str) {
//            return JSON.parseObject(str, type);
//        }
//
//        return (T) TypeUtils.cast(node, TypeUtils.getClass(type));
//    }
//
//    public static <T> T toJavaObj(Object node, Class<T> clazz) {
//        return JSON.to(clazz, node);
//    }
//
//    public static Object getJsonElement(JSONArray node, int index) {
//        return node.get(index);
//    }
//
//    public static Object getJsonElement(JSONObject node, String name) {
//        return node.get(name);
//    }
//
//    public static Object fromJavaObj(Object obj) {
//        Object result = null;
//        if (Objects.nonNull(obj) && (obj instanceof String str)) {
//            result = parseObject(str);
//        } else {
//            result = JSON.toJSON(obj);
//        }
//
//        return result;
//    }
//
//    public static Object parseObject(String str) {
//        return JSON.parseObject(str, Object.class);
//    }
//
//    public static String toStr(Object obj) {
//        if (Objects.isNull(obj)) {
//            return null;
//        }
//        if (obj instanceof String) {
//            return (String) obj;
//        }
//
//        return toJsonStr(obj);
//    }
//
//    public static String toJsonStr(Object obj) {
//        return JSON.toJSONString(obj);
//    }
//
//    public static String toPrettyStr(Object obj) {
//        return JSON.toJSONString(obj, JSONWriter.Feature.PrettyFormat);
//    }
//
//    public static ParameterizedType mackJavaType(Type rawType, Type... typeArguments) {
//        return new ParameterizedTypeImpl(typeArguments, null, rawType);
//    }
//}
